package uva.sc.ql.gui.listeners;
import java.awt.Component;
import java.util.List;
import java.util.Map;
import java.util.Observable;
import java.util.Observer;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import uva.sc.ql.atom.ID;
import uva.sc.ql.atom.NumberAtom;
import uva.sc.ql.evaluator.QuestionsPropertiesVisitor;
import uva.sc.ql.gui.helpers.ListenerHelper;
import uva.sc.ql.gui.helpers.QuestionData;
public class CalculatorListener implements DocumentListener, Observer {
private QuestionsPropertiesVisitor questionsProperties;
private List<Component> componentList;
private Map<ID, List<ID>> patronElements;
private JTextField textField;
private ID id;
public CalculatorListener(Map<ID, List<ID>> patronElements,
QuestionsPropertiesVisitor questionsProperties,
List<Component> componentList, JTextField textField, ID id) {
this.patronElements = patronElements;
this.questionsProperties = questionsProperties;
this.componentList = componentList;
this.textField = textField;
this.id = id;
this.questionsProperties.addObserver(this);
}
public void changedUpdate(DocumentEvent e) {
update(e);
}
public void insertUpdate(DocumentEvent e) {
update(e);
}
public void removeUpdate(DocumentEvent e) {
update(e);
}
public void update(DocumentEvent e) {
NumberAtom value = new NumberAtom(0.);
try {
value = new NumberAtom(Double.valueOf(textField.getText()));
} catch (Exception ex) {
} finally {
QuestionData data = questionsProperties.questionData(id);
data = new QuestionData(value, data.getVisibility());
questionsProperties.putToValuesTable(id, data);
}
}
public void update(Observable o, Object arg) {
List<ID> elements = patronElements.get(id);
for (ID element : elements) {
updateTextField(element);
}
}
private void updateTextField(ID element) {
JTextField textField = getTextField(element);
QuestionData data = questionsProperties.questionData(element);
NumberAtom number = (NumberAtom) data.evaluateValue(questionsProperties
.getValuesTable());
Double value = number.getValue();
if (Double.isFinite(value)) {
textField.setText(value.toString());
} else {
textField.setText("-");
}
}
private JTextField getTextField(ID element) {
ListenerHelper helper = new ListenerHelper();
JPanel panel = (JPanel) helper.getComponentByName(element,
componentList);
JTextField textField = (JTextField) panel.getComponent(2);
return textField;
}
}